package com.tedu.api.ee;

import org.junit.Test;

import javax.imageio.stream.ImageInputStream;
import java.io.*;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流---传输数据--传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常---标准IO
 *
 *
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误--有解决方案
 *               编译期：RunTimeException异常表示类
 *                      FileOutputStream创建对象----波浪线--抛出方法之外
 *               检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *               解决方案：①捕获异常（*）
 *                       ②抛出异常--抛出方法之外--打印控制台
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台输出异常对象名称，RunTimeException异常表示类
 *
 *               最后了解【throw与throws--RunTimeException】
 *
 * Error错误：描述系统级别的错误--出现--程序宕机
 *            非常低--->递归：自己调自己【方法】--->
 */
public class EE {
    /**
     * Error   错误---程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ----程序宕机---后台：9亿账号
     * while(){
     *     拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】---代码报波浪线
     *
     *               俩种处理手段：①捕获异常：记录错误--产生异常原因
     *                         语法：try{
     *                             怀疑代码可能有异常或者提示异常
     *                         }catch(小异常名字 e){
     *                             e.printStacktrace();打印异常信息
     *                         }catch(中异常名字 e){
     *                             e.printStacktrace();打印异常信息
     *                         }catch(大异常名字 e){ Exception
     *                             e.printStacktrace();打印异常信息
     *                         }finally{
     *                             一定执行代码块
     *                         }
     *                         快捷键：ctrl+alt+T
     *
     *                          ②抛出异常   throws  异常名字【并未解决】
     *               考试题：throw与throws的区别
     *               异常关键字：throw
     *                         throws
     *              非检查异常【出现运行期】---代码无错误---控制台
     *----------------
     * 异常：FileNotFoundException  文件不存在异常
     * 产生原因：路径写错、文件名写错
     * 异常：NullPointerException  空指针异常
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
     * 异常：StringIndexOutOfBoundsException  字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * 异常：NumberFormatException   数字转换异常
     * 产生原因：字符串不是正确的类型
     *
     * 异常：ConcurrentModificationException    并发修改异常
     * 异常：ArrayIndexOutOfBoundsException     数组下标越界异常
     * 异常：ParseException                     解析异常
     * 异常：ArithmeticException                数学运算异常
     * 异常：ClassCastException                 类型转换异常
     *
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线
        //FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】----控制台
        try {
            String str="a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);//解析字符串---转换为对应类型
        }catch(StringIndexOutOfBoundsException e){
            e.printStackTrace();//打印异常对象信息
            System.out.println("字符串小异常：下标越界异常~~");
        }
        catch (NumberFormatException e) {
            e.printStackTrace();//打印异常
            System.out.println("字符串小异常~~");
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("大异常~~");
        }
        finally {
            System.out.println("一定执行代码块~");
        }
    }

    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API----java.lang.异常
     *       字符串、包装类、集合、IO流
     */
    @Test
    public void testHomeWork1(){
        //1.
    /*ArrayList<Integer> list=new ArrayList<>();
    list.add(1);
    for(Integer e:list){
        list.add(4);
    }*/
        //2.
    /*int[] arr={1,2,3};
    System.out.println(arr[3]);*/
        //3.
    /*SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
    String datStr="2024-10-23 17:55:55";
    Date date=s.parse(datStr);*/
        //4.
        //System.out.println(1/0);
        //5.
    /*Object x = new Integer(0);
    System.out.println((String)x);*/
        //6.
    //    Object x[] = new String[3];
    //    x[0] = new Integer(0);



    }
}
//fainlly 与 final区别？【使用]
/*考试原题*/
//final【最终】 修饰类 不可改变类|
// 修饰属性 不可改变值【常量】|
// 修饰方法    方法不可以重写，可以重载
//finally 处理异常块 ：关闭流




